<?php

class ReservierungController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
        return $this->_redirect('/reservierung/zeigeliste');
        
    }

    public function karteAction()
    {
 		$NamespaceReservierung = new Zend_Session_Namespace('Reservierung');
     	$request = $this->getRequest();
		$parkplatznr = $request->getParam('bereich');
		$parkplatznrSession = $NamespaceReservierung->parkplatznr;
		
		$mapperParkplatz = new Application_Model_ParkplatzMapper();
		
		//Parkplatznummer auf Gültigkeit prüfen
		if (isset($parkplatznr)){
			if ($mapperParkplatz->parkplatzExists($parkplatznr) == false){
				unset($parkplatznr);
			}
		}
				
		if (!isset($parkplatznr) && isset($parkplatznrSession)){
				$parkplatznr = $parkplatznrSession;
		}
		
		//Standort anhand der Parkplatznummer auslesen
		if (isset($parkplatznr)){
			$bereich = $this->parkplatznrToParkplatzname($parkplatznr);
		}
		
		if (isset($bereich)) {
			
			$bemerkung = 'Es wurde der Bereich: ' . $bereich . ' ausgewählt.';
			$this->view->weiterbutton = true;
			$NamespaceReservierung->parkplatznr = $parkplatznr;

		}else {
			$bemerkung = 'Bitte wähle einen Bereich aus.';
			unset($NamespaceReservierung->parkplatznr);
		}
		$this->view->bemerkung = $bemerkung;
    }

    public function ticketauswahlAction()
    {
    	$NamespaceReservierung = new Zend_Session_Namespace('Reservierung');
    	
        $request = $this->getRequest();
		$ticketnr = $request->ticketnr;
        $mapperTicket = new Application_Model_TicketMapper();
        $this->view->data = $mapperTicket->getTicketsAktuell();//geht noch nicht
		
		$parkplatznr = $NamespaceReservierung->parkplatznr;
		$ticketnrSession = $NamespaceReservierung->ticketnr;
		$hinweise = array();
		
		//Parkbereich ausgeben
		if (isset($parkplatznr) ) {
			//Standort anhand der Parkplatznummer auslesen
			$bereich = $this->parkplatznrToParkplatzname($parkplatznr);			
			$hinweise[] = 'Es wurde der Bereich: ' . $bereich . ' ausgewählt.';
						
		}else {
			$hinweise[] = 'Bitte wähle einen Bereich aus.';
		}
		
		
    	//Ticketabfrage
		if (isset($ticketnr)){
			if ($mapperTicket->ticketExists($ticketnr) == true){
				$NamespaceReservierung->ticketnr = $ticketnr;
			}else{
				unset($ticketnr);
			}
		}
		
		//wenn kein Ticket ausgewählt wurde, aber zuvor schon einmal ausgwählt wurde
		//dann Ticketnummer aus Sessions lesen. Diese ist sicher richtig, da früher schon überprüft.
	    if (!isset($ticketnr) && isset($ticketnrSession)){
			$ticketnr = $ticketnrSession;
		}
		
		//wenn Ticketnummer gesetzt ist, dann ist sie sicher richtig.
		if (isset($ticketnr)){
			$ticketname = $ticketnr;//zum testen
			$ticketname = $this->ticketnrToTicketname($ticketnr);
		}
		
		//Ticketbezeichnung auslesen.
		if (isset($ticketname)){
			$hinweise[] = 'Es wurde das Ticket: ' . $ticketname . ' ausgewählt.';
		}else {
			$hinweise[] = 'Bitte wähle ein Ticket aus.';
		}
		
		$this->view->hinweise = $hinweise;
		
		//wenn beides ausgewählt wurde, dann zeige "weiter" an
    	if (isset($parkplatznr) && isset($NamespaceReservierung->ticketnr)){
			$this->view->weiterbutton = true;
		}
    }

    public function anlegenAction()
    {
    	
    }

    public function datumsauswahlAction()
    {
    	$NamespaceReservierung = new Zend_Session_Namespace('Reservierung');
    	$pareNamespace = new Zend_Session_Namespace('PaRe');
    	$mapperParkplatz = new Application_Model_ParkplatzMapper();//gibt array von einem model zurück
        $mapperTicket = new Application_Model_TicketMapper();//gibt model zurück
        
    	$fehlermeldung = array();
        $request = $this->getRequest();

        $benutzernr = $pareNamespace->nr;
        //benutzer
    	if (!isset($benutzernr)){
    		$fehlermeldung[] = "Sie sind nicht eingeloggt!";
    	}
        
        
		//parkbereich
        $parkplatznr = $NamespaceReservierung->parkplatznr;
        if (isset($parkplatznr)){
        	$bereich = $this->parkplatznrToParkplatzname($parkplatznr);
    		$parkplatzmodelarr = $mapperParkplatz->fetchParkplatz($parkplatznr);
    		$kalendername = $parkplatzmodelarr[0]->getKalenderName();
        } else {
    		$bereich = "kein Parkbereich";
    		$fehlermeldung[] = "Es wurde kein Parkbereich ausgewählt.";
    	}
    	
    	//ticket
    	$wochentage =array();
    	$ticketnr = $NamespaceReservierung->ticketnr;
    	if (isset($ticketnr)){
    		//$ticketname = $ticketnr;
    		$ticketname = $this->ticketnrToTicketname($ticketnr);
    		$ticketmodel = $mapperTicket->getTicket($ticketnr);
    		//bei festem zeitraum (ticketart=1) kein datumsfeld anzeigen
    		//bei festes dauer darf ein datum gewählt werden (ticketart=1)
    		if ($ticketmodel->getTicketart()==0){
    			//feste dauer an bestimmten wochentagen
    			$datumswahl = true;
    			$festesdatum = false;
    			//an welchen wochentagen darf dieses ticket starten
    			$wochentage = $ticketmodel->getTage();//welche wochentage
    			$dauer = $ticketmodel->getDauer();//wie viele tage
    		}else{
    			$datumswahl = false;
    			$festesdatum = array('von' => $ticketmodel->getGueltig_ab(), 'bis' => $ticketmodel->getGueltig_bis());
    		}
    		
    	} else {
    		$ticketname = "nicht ausgewählt";
    		$fehlermeldung[] = "Es wurde kein Ticket ausgewählt."; 
    		$datumswahl = true;
    		$festesdatum = false;//damit man den kalender sieht
    	}
    	
    	    	
    	//wenn sachen fehlen, muss trotzdem das formular erscheinen
    	//aber mit vorbesetzten fehlertexten
    	//wenn datumswahl true, erscheint ein datumsfeld
    	$form = new Application_Form_ReservierungAnlegenForm(null,$bereich,$ticketname,$datumswahl);
    	
    	//kalender
    	if (isset($kalendername)){
	    	$kalenderTBL = new Application_Model_KalenderMapper();
		    $kalenderTBL->setTableName($kalendername);
		    $kalenderTBL->setMaxanzahl($parkplatzmodelarr[0]->getAnzahl());//Anzahl an Parkplätzen setzen
		    $kalenderminmax = $kalenderTBL->getMinMax();
		    
		    if (!isset($kalenderminmax)){
		    	$fehlermeldung[]= "Kalender leer";
		    }
    	}
    	
    	//wenn auf reservieren gedrückt wurde
    	if ( isset($ticketnr) && isset($parkplatznr) && isset($benutzernr)){
    		//wenn bereich und ticket ausgewählt wurden, dann überprüfe das formular
	    	
			if ($this->getRequest()->isPost()) { 
				if ($form->isValid($request->getPost())) {
					$model = new Application_Model_Reservierung($form->getValues());
					//einzeln setzen, da diese sachen aus den sesssions kommen.
					$model->setTicketnr($ticketnr);
					$model->setParkplatznr($parkplatznr);
					if ($festesdatum == false){
					  	$datumvon = $model->getDatumvon();
					  	
					  	$wochentagzahl = date('N',strtotime($datumvon ) );
					  	if (!in_array($wochentagzahl, $wochentage)){
					  		$fehlermeldung[] = 'Falscher Wochentag ausgewählt';
					  	}
					  	 
						if ($dauer>1){
							$dauer--;
							$datumbis = date("Y-m-d",strtotime("+" .$dauer. " day", strtotime($datumvon)) );
						}else {
							$datumbis = $datumvon;
						}
					  	
						
					  }else{
					  	$datumvon = $festesdatum['von'];
					  	$datumbis = $festesdatum['bis'];				
					}
					/*strtotime gibt nichts zurück, falls ein ungültiges Datum (z.b. Buchstaben)
					 * angegeben wurde. Deshalb kommt man nur mit einem gültigen Datum weiter
					 */
					if ( !( (strtotime($kalenderminmax['min']) <= strtotime($datumvon))
							 && (strtotime($datumbis) <= strtotime($kalenderminmax['max']))
							  ) ){
						$fehlermeldung[] = 'Reservierung überschreitet Kalender';
					}
					$preis = $ticketmodel->getPreis();
					$model->setDatumvon($datumvon);
					$model->setDatumbis($datumbis);
					$model->setBenutzernr($benutzernr);
					$model->setPreis($preis);
					
					if (sizeof($fehlermeldung) == 0){
						$antwort = $kalenderTBL->eintragen($datumvon, $datumbis, $benutzernr);
						if ($antwort==true){
							
							$reservierungenTBL = new Application_Model_ReservierungenMapper();
		        			$reservierungenTBL->anlegen($model);
		        			return $this->_redirect('/reservierung/anlegen');
						}else{
							$fehlermeldung[] = 'Kalender an einem oder allen Tagen bereits voll';
						}
						
					}else {
						$fehlermeldung[] = "Es wurde keine Reservierung eingetragen";
						
					}
					
		        	
				}
			}
			//ende formularüberprüfung
    	}
		$this->view->hinweise = $fehlermeldung;
		$this->view->festesdatum = $festesdatum;//false oder array(von=>datum,bis=>datum)
		$this->view->form = $form;
    }

    public function zeigelisteAction()
    {
        // action body
        $pareNamespace = new Zend_Session_Namespace('PaRe');
        $request = $this->getRequest();
        
        $fehlermeldung = array();
        
        $entries = array();//für foreach schleife
        
        //hier benutzerid aus session lesen
        $benutzernr = $pareNamespace->nr;
        //$benutzernr = $request->benutzernr;
        
        $status = $pareNamespace->status;
        //$pareNamespace->status = '';//zum testen
        //$status = 'Admin';//zum testen
        
        $this->view->data = array();
        
        if (isset($benutzernr) && isset($status)){
	        $this->view->status = $status;//zum testen diese zeile auskommentieren
	        
	        $deletenr = $request->delete;
	   		$reservierungenTBL = new Application_Model_ReservierungenMapper();
	   		
	   		//wenn admin dann alle anzeigen
	        if ($status == 'Admin'){
	        	$data = $reservierungenTBL->fetchAll();
	        	
	        }else{
	            $data = $reservierungenTBL->fetchReservierungen($benutzernr); 
	        }
	        
	        //parkplatz und ticketnummer durch standort und ticketname ersetzen
	        foreach ($data as $index => $row){
	        	$entry = new Application_Model_Reservierung();
     			$entry->setNr($row->getNr());
     			$entry->setBenutzernr($row->getBenutzernr());
     			
     			$entry->setDatumvon($row->getDatumvon() );
     			$entry->setDatumbis($row->getDatumbis() );
     			$entry->setPreis($row->getPreis() );
     		
     		
	        	$parkplatznrtmp = $row->getParkplatznr();
	        	$parkbereich = $this->parkplatznrToParkplatzname($parkplatznrtmp);
	        	$entry->setParkplatznr($parkbereich);
	        	
	        	
				$ticketnrtmp = $row->getTicketnr();
				$ticketname = $this->ticketnrToTicketname($ticketnrtmp);
				
	        	$entry->setTicketnr($ticketname);

	        	$entries[] = $entry;
	        }
	        
	        $this->view->data = $entries;
	        
	        if (sizeof($data)==0){
	        	$fehlermeldung[] = "Es sind keine Reservierungen vorhanden.";
	        }
	        
	        
	        //stornieren(delete) wurde gedrückt
	        if (isset($deletenr)){
	        	$model = $reservierungenTBL->fetchReservierung($deletenr);
	        	
	        	if(!is_null($model)){//wenn null, dann gibt es diese reservierung mit der reservierungsnr nicht.
	        		//wenn benutzer admin ist, dann stornieren von beliebigen reservierungen möglich
	        		//sonst muss die benutzernr der session mit der benutzernr der reservierung übereinstimmen
	        		if ( ($model->getBenutzernr()==$benutzernr) || ($status == 'Admin')){
	        			$kalendername = 'kalender'; //$parkplatzmapper->fetchParkplatz($model->getParkplatznr() );
	        			
	        			$kalenderTBL = new Application_Model_KalenderMapper();
	        			$kalenderTBL->setTableName($kalendername);
	        			//$kalenderTBL->setMaxanzahl()//hier nicht nötig
	        			$reservierungenTBL->stornieren($deletenr);//reservierung löschen
	        			
	        			$benutzernrtmp = $model->getBenutzernr();//damit benutzernr nicht überschrieben wird
	        			$kalenderTBL->austragen($model->getDatumvon(), $model->getDatumbis(), $benutzernrtmp);//aus kalender löschen
	        			return $this->_redirect('/reservierung/zeigeliste');
	        		}//else //benutzer darf diese reservierung nicht löschen.
	        	}//else //reservierungsnr ungültig	
	        }

        }else{
        	$fehlermeldung[] = "Sie sind nicht eingeloggt.";
        }
        
        $this->view->hinweise = $fehlermeldung;
          
    }
    
    private function parkplatznrToParkplatzname($parkplatznr){
    	$mapperParkplatz = new Application_Model_ParkplatzMapper();
    	if ($mapperParkplatz->parkplatzExists($parkplatznr) == true){
	    	//wenn der Parkplatz noch existiert,
	        //bereich aus parkplatzmapper auslesen
			$tempParkplatzModel = $mapperParkplatz->fetchParkplatz($parkplatznr);
			$parkbereich = $tempParkplatzModel[0]->getStandort();
		}else {
	    	//wenn nicht existiert, dann nur die nummer ausgeben
	    	$parkbereich = $parkplatznr;
	    }
	    return $parkbereich;
    }

    private function ticketnrToTicketname($ticketnr){
    	$mapperTicket = new Application_Model_TicketMapper();
    	if ($mapperTicket->ticketExists($ticketnr) == true){
			//wenn das Ticket noch existiert,
		   	//ticketname aus ticketmapper auslesen
			$tempTicketModel = $mapperTicket->getTicket($ticketnr);
			$ticketname = $tempTicketModel->getName();
		 }else {
		    //wenn nicht existiert, dann nur die nummer ausgeben
		    $ticketname = $ticketnr;
		 }
	   return $ticketname;
    }

}